import axios from "axios";
import { getToken } from "@/utils/auth"
import { ElMessage } from "element-plus";

const Server = axios.create({
    baseURL: "",
    timeout: 20000,
    retry: 3,
    retryDelay: 3000,
})

//拦截器配置
Server.interceptors.request.use(config => {
    let token = getToken();
    if (token) {
        config.headers['Authorization'] = token;
    }
    return config;
}, error => Promise.reject(error));

Server.interceptors.response.use(response => {
    // console.log(response)
    return response.data;
}, error => {
    let { message } = error;
    if (message.includes("timeout")) {
        message = "系统请求接口超时"
    }
    ElMessage.error(message);

    //错误重试机制
    //error.config是一个对象，包含了上面create方法设置的参数信息
    var config = error.config;
    console.log("错误配置信息",config);
    //判断是否有配置项
    if (!config || !config.retry) {
        return Promise.reject(error)
    }

    //增加一个属性记录是第几次重试的逻辑_retryCount
    config._retryCount = config._retryCount || 0;
    //判断重试的次数，如果超过了，直接返回错误信息
    if (config._retryCount >= config.retry) {
        console.log("接口请求次数超限")
        return Promise.reject(error);
    }
    console.error("请求失败重试中:", config);

    config._retryCount++;
    //设置重试执行的间隔时间逻辑
    let delay = new Promise((resolve) => {
        setTimeout(() => {
            resolve();
        }, config.retryDelay || 0)
    });
    //指定的时间范围之后，重新调用一下接口，看接口是否能够成功
    delay.then(function () {
        console.log("重新发起接口请求");

        return Server(config);
    })
    return Promise.reject(message);
});


export default Server;